package org.huangrui.javase.collectionMap.map;

import org.junit.Test;

import java.util.HashMap;

/**
 * @Author hr
 * @Create 2025-11-07 17:00
 **/
public class T01HashMap {
    @Test
    public void test1(){
        HashMap<Integer,String> map = new HashMap<>(40);
        map.put(1,"hello");
        System.out.println(map);
    }

    @Test
    public void test2(){
        String s1 = "Aa";
        String s2 = "BB";
        String s3 = "CC";

        System.out.println(s1.hashCode());//2112
        System.out.println(s2.hashCode());//2112
        System.out.println(s3.hashCode());//2144
        System.out.println(s1 == s2);//false
        /*
        因为hashCode不等价于内存地址，它是根据对象的属性值来计算出来的。计算的时候有一个公式/算法。
        假设 y代表hashCode值,x代表对象，f代表某个函数或公式

            y = f(x)
            是不是会存在两个x值不同，但是y值相同。
            所以 存储两个不同的Java对象，但是它们的hashCode相同的。例如：Aa和BB
         */
    }

    @Test
    public void test3(){
        HashMap<MyKey, Integer> map = new HashMap<>();

        for(int i=1; i<=8; i++){
            map.put(new MyKey(i), i);
        }

        map.put(new MyKey(9),9);
        map.put(new MyKey(10),10);
        map.put(new MyKey(11),11);//树化
        map.put(new MyKey(12),12);
    }

    @Test
    public void test4(){
        HashMap<MyKey, Integer> map = new HashMap<>();

        for(int i=1; i<=11; i++){
            map.put(new MyKey(i), i);
        }
        //上面的代码保证出现树
        //上面有11对

        map.remove(new MyKey(1));
        map.remove(new MyKey(2));
        map.remove(new MyKey(3));
        map.remove(new MyKey(4));
        map.remove(new MyKey(5));
        //到这一步之后，红黑树中剩下6对
        map.remove(new MyKey(6));
        map.remove(new MyKey(7));
        map.remove(new MyKey(8));//反树化
        map.remove(new MyKey(9));
    }

    @Test
    public void test5(){
        HashMap<MyKey, Integer> map = new HashMap<>();

        for(int i=1; i<=11; i++){
            map.put(new MyKey(i), i);
        }
        //上面的代码保证出现树
        //上面有11对

        map.remove(new MyKey(1));
        map.remove(new MyKey(2));
        map.remove(new MyKey(3));
        map.remove(new MyKey(4));
        map.remove(new MyKey(5));
        //到这一步之后，红黑树中剩下6对

        //继续put
        for(int i=21; i<100; i++){
            map.put(new MyKey(i),i);
        }
        //扩容的临界值 threshold = table.length * loadFactor
        // threshold = 64 * 0.75 = 48
        //size >= 48 扩容

    }
}
